home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / artemis1 / src / plt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-17  |  9.2 KB  |  417 lines

  1. /*
  2.     ARTemis (Graphic Editor for FM-TOWNS)
  3.     (c) MATSUUCHI Ryosuke 1992
  4.  
  5.     plt.c
  6. */
  7.  
  8. // #define    DEBUG
  9.  
  10. #include <stdio.h>
  11. #include <egb.h>
  12.  
  13. #include "ge.h"
  14. #include "plt16.h"
  15. #include "dispman.h"
  16. #include "mainmenu.h"
  17.  
  18.  
  19. /*--------------------------------------------------------*/
  20. /*                        2色表示                        */
  21. /*--------------------------------------------------------*/
  22.  
  23. static    bool     colsdisp = NO;
  24. static    MENU    *cols_menu = NULL;
  25. static    int        cols_item1,cols_item2;
  26. static    int        *cols_1,*cols_2;
  27. static    int        colcsrpos = 0;
  28.  
  29.  
  30. void cols_init(int *col1,int *col2, MENU *menu, int itemcol1, int itemcol2)
  31. {
  32.     cols_menu = menu;
  33.     cols_item1 = itemcol1, cols_item2 = itemcol2;
  34.     cols_1 = col1, cols_2 = col2;
  35. }
  36.  
  37.  
  38. bool getcolsdisp()
  39. {
  40.     return colsdisp;
  41. }
  42.  
  43. void makeupCols()
  44. /*
  45.     ページ1の色表示のみを更新する
  46. */
  47. {
  48.     int ix,iy,ixlen,iylen;
  49.     if (!colsdisp)
  50.         return;
  51.     if (!DMgetifonepage())
  52.     {
  53.         int zr = DMimage_getzoomrate();
  54.         page_edit();
  55.         menu_getbuttonxy(cols_menu, cols_item1, &ix, &iy, &ixlen, &iylen);
  56.         grboxfill(DMgetpage1x(ix),DMgetpage1y(iy),
  57.                   ixlen/zr,iylen/zr, *cols_1, DrawNORMAL);
  58.         menu_getbuttonxy(cols_menu, cols_item2, &ix, &iy, &ixlen, &iylen);
  59.         grboxfill(DMgetpage1x(ix),DMgetpage1y(iy),
  60.                   ixlen/zr,iylen/zr, *cols_2, DrawNORMAL);
  61.         page_menu();
  62.     }
  63.     else
  64.     {
  65.         menu_getbuttonxy(cols_menu, cols_item1, &ix, &iy, &ixlen, &iylen);
  66.         grboxfill(ix,iy,ixlen-1,iylen-1, *cols_1, DrawNORMAL);
  67.         menu_getbuttonxy(cols_menu, cols_item2, &ix, &iy, &ixlen, &iylen);
  68.         grboxfill(ix,iy,ixlen-1,iylen-1, *cols_2, DrawNORMAL);
  69.     }
  70. }
  71.  
  72.  
  73. int drawCols()
  74. {
  75.     int ix,iy,ixlen,iylen;
  76.     if (!DMgetifonepage())
  77.     {
  78.         int zr = DMimage_getzoomrate();
  79.         menu_getbuttonxy(cols_menu, cols_item1, &ix, &iy, &ixlen, &iylen);
  80.         if (DMmenu2_addbox(ix,iy,ixlen,iylen) != 0)
  81.             return -1;
  82.         grboxfill(ix-1,iy-1,ixlen+1,iylen+1,0,DrawNORMAL);
  83.         grboxline(ix-1,iy-1,ixlen+1,iylen+1,Black,DrawNORMAL);
  84.         page_edit();
  85.         grboxfill(DMgetpage1x(ix),DMgetpage1y(iy),
  86.                   ixlen/zr,iylen/zr,*cols_1,DrawNORMAL);
  87.         //
  88.         page_menu();
  89.         menu_getbuttonxy(cols_menu, cols_item2, &ix, &iy, &ixlen, &iylen);
  90.         if (DMmenu2_addbox(ix,iy,ixlen,iylen) != 0)
  91.             return -1;
  92.         grboxfill(ix-1,iy-1,ixlen+1,iylen+1,0,DrawNORMAL);
  93.         grboxline(ix-1,iy-1,ixlen+1,iylen+1,Black,DrawNORMAL);
  94.         page_edit();
  95.         grboxfill(DMgetpage1x(ix),DMgetpage1y(iy),
  96.                   ixlen/zr,iylen/zr,*cols_2,DrawNORMAL);
  97.         page_menu();
  98.     }
  99.     else
  100.     {
  101.         menu_getbuttonxy(cols_menu, cols_item1, &ix, &iy, &ixlen, &iylen);
  102.         grboxline(ix-1,iy-1,ixlen+1,iylen+1,menu_plt(Black),DrawNORMAL);
  103.         grboxfill(ix,iy,ixlen-1,iylen-1,*cols_1,DrawNORMAL);
  104.         menu_getbuttonxy(cols_menu, cols_item2, &ix, &iy, &ixlen, &iylen);
  105.         grboxline(ix-1,iy-1,ixlen+1,iylen+1,menu_plt(Black),DrawNORMAL);
  106.         grboxfill(ix,iy,ixlen-1,iylen-1,*cols_2,DrawNORMAL);
  107.     }
  108.     colsdisp = YES;
  109.     return 0;
  110. }
  111.  
  112.  
  113. void eraseCols()
  114. {
  115.     colsdisp = NO;
  116.     if (!DMgetifonepage())
  117.     {
  118.         DMmenu2_deletebox();
  119.         DMmenu2_deletebox();
  120.     }
  121. }
  122.  
  123.  
  124. int cols_getcsrpos()
  125. {
  126.     return colcsrpos;
  127. }
  128.  
  129. void cols_setcsrpos(int n)
  130. {
  131.     colcsrpos = n;
  132. }
  133.  
  134. void drawColCsr()
  135. {
  136.     int ix,iy,ixlen,iylen;
  137.     menu_getbuttonxy(cols_menu, (colcsrpos==0 ? cols_item1: cols_item2),
  138.                    &ix, &iy, &ixlen, &iylen);
  139.     grboxline(ix-1,iy-1,ixlen+1,iylen+1,menu_plt(White),DrawXOR);
  140. }
  141.  
  142. /*--------------------------------------------------------*/
  143. /*               パレットリストの描画・消去                */
  144. /*--------------------------------------------------------*/
  145.  
  146.  
  147. static bool pltlist_dsp = NO;
  148.                 // パレットリストを表示しているかどうか
  149. static int pltlist_x,pltlist_y;
  150.                 // パレットリストを表示している位置(640*480座標)
  151. static int pltlist_preDispX,pltlist_preDispY;
  152.                 // パレットリストを表示している時の dispX, dispY の値
  153.  
  154.  
  155. void makeupPltList()
  156. // パレットリストを更新する
  157. {
  158.     int zr = DMimage_getzoomrate();
  159.     DEBUG_MSG("makeupPltList begin");
  160.     if (!DMgetifonepage())
  161.     {
  162.         int i,j,px,py;
  163.         page_edit();
  164.         px = DMgetpage1x(pltlist_x);
  165.         py = DMgetpage1y(pltlist_y);
  166.         for (i=0; i<4; i++)
  167.         {
  168.             for (j=0; j<4; j++)
  169.             {
  170.                 grboxfill(px+(j*16)/zr,py+(i*16)/zr,
  171.                           16/zr,16/zr,plt_getcode(i*4+j),DrawNORMAL);
  172.             }
  173.         }
  174.         page_menu();
  175.     }
  176.     else
  177.     {
  178.         int i,j,px,py;
  179.         px = pltlist_x;
  180.         py = pltlist_y;
  181.         for (i=0; i<4; i++)
  182.         {
  183.             for (j=0; j<4; j++)
  184.             {
  185.                 grboxfill(px+j*16,py+i*16,15,15,plt_getcode(i*4+j),DrawNORMAL);
  186.             }
  187.         }
  188.     }
  189.     DEBUG_MSG("makeupPltList end");
  190. }
  191.  
  192.  
  193. int drawPltList(int x,int y)
  194. // パレットリストを新たに描く(menumode == 0 時、元の画像は保存)
  195. {
  196.     int zr = DMimage_getzoomrate();
  197.     DEBUG_MSG("drawPltList begin");
  198.     if (!DMgetifonepage())
  199.     {
  200.         int px,py;
  201.         pltlist_dsp = YES;
  202.         pltlist_preDispX = DMgetpage1x(x);
  203.         pltlist_preDispY = DMgetpage1y(y);
  204.         if (x != -1)
  205.             pltlist_x = x;
  206.         if (y != -1)
  207.             pltlist_y = y;
  208.         page_edit();
  209.         px = DMgetpage1x(pltlist_x);
  210.         py = DMgetpage1y(pltlist_y);
  211.         if (DMmenu2_addbox(pltlist_x,pltlist_y,16*4,16*4) != 0)
  212.             { page_menu();  return -1; }
  213.         page_menu();
  214.         makeupPltList();
  215.     }
  216.     else
  217.     {
  218.         pltlist_dsp = YES;
  219.         if (x != -1)
  220.             pltlist_x = x;
  221.         if (y != -1)
  222.             pltlist_y = y;
  223.         makeupPltList();
  224.     }
  225.     DEBUG_MSG("drawPltList end");
  226.     return 0;
  227. }
  228.  
  229.  
  230. void erasePltList()
  231. // パレットリストを消去する
  232. {
  233.     DEBUG_MSG("erasePltList begin");
  234.     if (!DMgetifonepage())
  235.     {
  236.         pltlist_dsp = NO;
  237.         DMmenu2_deletebox();
  238.     }
  239.     else
  240.         pltlist_dsp = NO;
  241.     DEBUG_MSG("erasePltList end");
  242. }
  243.  
  244.  
  245. void drawPltList_init(int x, int y)
  246. {
  247.     int i,j;
  248.     for (i=0; i<4; i++)
  249.     {
  250.         for (j=0; j<4; j++)
  251.         {
  252.             grboxfill(x-1+j*16,y-1+i*16,17,17,menu_plt(Transparent),DrawNORMAL);
  253.             grboxline(x-1+j*16,y-1+i*16,17,17,menu_plt(Black),DrawNORMAL);
  254.         }
  255.     }
  256. }
  257.  
  258.  
  259. bool getPltList_disp()
  260. {
  261.     return pltlist_dsp;
  262. }
  263.  
  264.  
  265. void    drawPltCsr(int c)
  266. // DRAW PaLetTe CurSoR : パレットリストの中の1パレットを四角で囲む
  267. {
  268.     int cx,cy;
  269.     cx = pltlist_x + (c%4)*16;
  270.     cy = pltlist_y + (c/4)*16;
  271.     grboxfill(cx-1,cy-1,17,17,menu_plt(White),DrawXOR);
  272.     grboxfill(cx,cy,15,15,menu_plt(White),DrawXOR);
  273. }
  274.  
  275.  
  276. /*--------------------------------------------------------*/
  277. /*                  RGB バーの描画・更新                   */
  278. /*--------------------------------------------------------*/
  279.  
  280.  
  281. static    int        rgb_x,rgb_y;
  282. #define    _RGBBAR_MAXLEN    (mode == MODE16 ? 30 : 31)
  283.  
  284.  
  285. void makeupRgbBar()
  286. {
  287.     DEBUG_MSG("makeupRgbBar begin");
  288.     int i,rgb[3];
  289.     static int RGBcol[]={White,White,White};
  290.     if (mode == MODE32K)        // 3万色モード
  291.     {
  292.         int t;
  293.         t = plt_getcode(pltnum);
  294.         rgb[0]=getR(t), rgb[1]=getG(t), rgb[2]=getB(t);
  295.     }
  296.     else if (mode == MODE16)                    // 16色モード
  297.     {
  298.         grb_t grb;
  299.         grb = plt16_get(pltnum);
  300.         rgb[0] = (grb>>4)&15,  rgb[1] = (grb>>8)&15,  rgb[2] = grb&15;
  301.     }
  302.     else                    // 256色モード
  303.         DEBUG_MSG("☆☆ makeupRgbBar : 256色未定義!");
  304.     for (i=0; i<3; i++)
  305.     {
  306.         int    barlen, barx;
  307.         int a = rgb[i];
  308.         barx = rgb_x + i * 14;
  309.         // 縦棒グラフを描く
  310.         barlen = (mode == MODE16 ? a*2 : a);
  311.         grboxfill(barx, rgb_y, 11, _RGBBAR_MAXLEN, menu_plt(Black), DrawNORMAL);
  312.         if (a!=0)
  313.         {
  314.             grboxfill(barx, rgb_y + (_RGBBAR_MAXLEN - barlen), 11, barlen,
  315.                       menu_plt(RGBcol[i]), DrawNORMAL);
  316.         }
  317.         // 数値を表示する
  318.         putpict(barx  , rgb_y+32+12*2+1, Pnonum);
  319.         putpict(barx+6, rgb_y+32+12*2+1, Pnonum);
  320.         if (a >= 10)
  321.             putpict(barx  , rgb_y+32+12*2+1, Pzero + a/10);
  322.         putpict(barx+6, rgb_y+32+12*2+1, (Pzero + a % 10) );
  323.     }
  324.     DEBUG_MSG("makeupRgbBar end");
  325. }
  326.  
  327.  
  328. void drawRgbBar(int x, int y)
  329. {
  330.     DEBUG_MSG("drawRgbBar begin");
  331.     int i;
  332.     rgb_x = x;
  333.     rgb_y = y;
  334.     for (i=0; i<3; i++)
  335.     {
  336.         grboxfill(x+i*14, y, 11, _RGBBAR_MAXLEN, menu_plt(Black), DrawNORMAL);
  337.         putpict(x+i*14, y+32,    Pupsw);
  338.         putpict(x+i*14, y+32+12, Pdownsw);
  339.         putpict(x+i*14, y+64, Prgb_r + i);
  340.     }
  341.     makeupRgbBar();
  342.     DEBUG_MSG("drawRgbBar end");
  343. }
  344.  
  345.  
  346. #undef _RGBBAR_MAXLEN
  347.  
  348.  
  349. /*--------------------------------------------------------*/
  350. /*                     RGB 要素の増減                     */
  351. /*--------------------------------------------------------*/
  352.  
  353.  
  354. void touchRgbBar(int ax, int ay, int btn)
  355. {
  356.     DEBUG_MSG("touchRgbBar begin");
  357.     int rgb[3],t,rgbx;
  358.     rgbx = ax / 14;
  359.     if ((ax % 14) > 11)
  360.         return;
  361.     if (mode == MODE32K)        // 3万色編集の場合
  362.     {
  363.         t = plt_getcode(pltnum);
  364.         rgb[0]=getR(t), rgb[1]=getG(t), rgb[2]=getB(t);
  365.         if (0<=ay && ay<=31)
  366.             rgb[rgbx]= 31-ay;
  367.         else if (32<=ay && ay<32+12)
  368.         {
  369.             if (btn==OFFON && rgb[rgbx]<31)
  370.                 rgb[rgbx]++;
  371.         }
  372.         else if (32+12<=ay && ay<32+24)
  373.         {
  374.             if (btn==OFFON && rgb[rgbx]>0)
  375.                 rgb[rgbx]--;
  376.         }
  377.         plt_setcode(pltnum, GRB(rgb[1],rgb[0],rgb[2]));
  378.     }
  379.     else if (mode == MODE16)    // 16色編集の場合
  380.     {
  381.         page_edit();
  382.         {
  383.             grb_t grb;
  384.             grb = plt16_get(pltnum);
  385.             rgb[0] = (grb>>4)&15,  rgb[1] = (grb>>8)&15,  rgb[2] = grb&15;
  386.         }
  387.         page_menu();
  388.         if (0<=ay && ay<=30)
  389.             rgb[rgbx]= (30-ay)/2;
  390.         else if (32<=ay && ay<32+12)
  391.         {
  392.             if (btn==OFFON && rgb[rgbx]<15)
  393.                 rgb[rgbx]++;
  394.         }
  395.         else if (32+12<=ay && ay<32+24)
  396.         {
  397.             if (btn==OFFON && rgb[rgbx]>0)
  398.                 rgb[rgbx]--;
  399.         }
  400.         page_edit();
  401.         {
  402.             grb_t grb;
  403.             grb = (int)rgb[1] * 256 + (int)rgb[0] * 16 + rgb[2];
  404.             plt16_set(pltnum,grb);
  405.         }
  406.         page_menu();
  407.     }
  408.     else
  409.         DEBUG_MSG("touchRgbBar : 256色未定義!");
  410.     makeupPltList();
  411.     makeupRgbBar();
  412.     DEBUG_MSG("touchRgbBar end");
  413. }
  414.  
  415.  
  416. /* end of plt.c */
  417.